package dataProviders;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedList;

import dataBase.QueryDB;
import entities.KontrFirma;
import entities.Probka;
import entities.TypBadan;
import entities.TypProbki;

public class SamplesDataProvider 
{
	static QueryDB db = new QueryDB();
	
	
	public static int addSample(Probka p)
	{
		String sql = null;
		if( p.getKontrahent().getClass() == KontrFirma.class )
		{
			sql = "INSERT INTO Probki " +
			"(uwagi,dataRejestracji,typProbkiID,kontrahentID,pacjentID,idObcy) " +
			"VALUES( '"+ p.getUwagi() +"',GETDATE(),"+ p.getTypProbki().getId() +", "+ p.getKontrahent().getKontrahentID() +", "+ p.getPacjent().getId()+", '"+ p.getIdZewn() +"' )";
		}
		else
		{
			sql = "INSERT INTO Probki " +
			"(uwagi,dataRejestracji,typProbkiID,kontrahentFizycznyID,pacjentID,idObcy) " +
			"VALUES( '"+ p.getUwagi() +"',GETDATE(),"+ p.getTypProbki().getId() +", "+ p.getKontrahent().getKontrahentID() +", "+ p.getPacjent().getId()+", '"+ p.getIdZewn() +"' )";
		}
		try 
		{
			db.dbSqlUpdate(sql);
			db.dbCommit();
			return ostatnieIdProbki();
		}
		catch (SQLException e) 
		{
			e.printStackTrace();
			return -1;
		}				
	}
	public static String getNameOfSampleType(int typProbkiID)
	{
		String sql = "SELECT nazwa FROM typy_probek WHERE typProbkiID = "+typProbkiID;
		try {
			ResultSet wynik = db.dbSqlQuery(sql);
			wynik.next();
//			System.out.println("Nazwa typu probki: "+wynik.getString("nazwa"));
			return wynik.getString("nazwa");
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
	}
	public static LinkedList<Probka> getListProbek()
	{
		LinkedList<Probka> listaProbek = new LinkedList<Probka>();
		try 
		{
			String sql = "SELECT probkaID, typProbki, kontrahentID, pacjentID, uwagi, datRejestracji FROM Probka";
			ResultSet wynik = db.dbSqlQuery( sql );
			while( wynik.next() )
			{
				Probka probka = new Probka(wynik.getInt("probkaID"),wynik.getInt("typProbki"),wynik.getInt("kontrahentID"), wynik.getInt("pacjentID"),wynik.getString("uwagi"), wynik.getString("dataRejestracji" ));
				listaProbek.add( probka );
			}
			return listaProbek;
		} 
		catch (SQLException e) 
		{
			e.printStackTrace();
			return null;
		}
	}
	public static LinkedList<TypProbki> getListOfSamplesTypes()
	{		
		LinkedList<TypProbki> listaTypow = new LinkedList<TypProbki>();
		try 
		{
			String sql = "SELECT typProbkiID, nazwa FROM Typy_probek";
			ResultSet wynik = db.dbSqlQuery( sql);
			while( wynik.next() )
			{
				TypProbki probki = new TypProbki(wynik.getInt("typProbkiID"), wynik.getString("nazwa"));
				listaTypow.add( probki );
			}
			return listaTypow;
		} 
		catch (SQLException e) 
		{
			e.printStackTrace();
			return null;
		}	
	}
	public static LinkedList<TypBadan> getListaBadanDlaTypu(TypProbki t)
	{		
		LinkedList<TypBadan> listaBadan = new LinkedList<TypBadan>();
		try 
		{
			String sql = "SELECT typBadaniaID, typProbkiID, nazwa, cena FROM Typy_badan WHERE typProbkiID = '"+t.getId()+"'";
			ResultSet wynik = db.dbSqlQuery( sql);
			while( wynik.next() )
			{
				TypBadan badania = new TypBadan(wynik.getInt("typBadaniaID"), new TypProbki(wynik.getInt("typProbkiID")), wynik.getString("nazwa"), wynik.getDouble("cena" ));
				listaBadan.add( badania );
			}
			return listaBadan;
		} 
		catch(SQLException e) 
		{
			e.printStackTrace();
		}
		catch(NullPointerException e)
		{
			System.out.println( "Pusta lista badan" );
		}
		return listaBadan;
	}	
	public boolean delSample(int id) 
	{	
		String sql = "DELETE FROM Probka WHERE probkaID = '" + id + "';";
		try 
		{
			db.dbSqlUpdate( sql );
			db.dbCommit();
			return true;
		}
		catch (SQLException e) 
		{
			e.printStackTrace();
			return false;
		}
	}

	public static int ostatnieIdProbki() {

		int ostatnieId = -1;

		try 
		{
			String sql ="SELECT IDENT_CURRENT('Probki') as \"id\"";
			ResultSet wynik = db.dbSqlQuery( sql);
			while( wynik.next() )
			{
				ostatnieId = wynik.getInt("id");

			}
			return ostatnieId;
		} 
		catch(SQLException e) 
		{
			e.printStackTrace();
			return ostatnieId;
		}
	}
	public static String getContractorName(int idProbki)
	{
		int tmpId = -1;
		String sql = "SELECT kontrahentID, kontrahentFizycznyID FROM Probki WHERE probkaID ="+idProbki;
		ResultSet wynik; 
		try 
		{
			wynik = db.dbSqlQuery(sql);
			wynik.next();

			if(wynik.getObject(1)==null)
			{
				tmpId = wynik.getInt("kontrahentFizycznyID");	
				sql = "SELECT imie, nazwisko, ulica, numer, miasto FROM Osoby_fizyczne WHERE fizycznaID="+tmpId;
				wynik = db.dbSqlQuery(sql);
				wynik.next();
				StringBuilder tmpNazwa = new StringBuilder();
				tmpNazwa.append(wynik.getString("nazwisko")+", ");
				tmpNazwa.append(wynik.getString("imie")+", ");	
				tmpNazwa.append(wynik.getString("ulica")+" ");			
				tmpNazwa.append(wynik.getInt("numer")+", ");
				tmpNazwa.append(wynik.getString("miasto"));
				return tmpNazwa.toString();				
			}
			else
			{
				tmpId = wynik.getInt("kontrahentID");
				sql = "SELECT nazwa, ulica, numer, miasto FROM Kontrahenty_prawny WHERE kontrahentID="+tmpId;
				wynik = db.dbSqlQuery(sql);
				wynik.next();
				StringBuilder tmpNazwa = new StringBuilder();
				tmpNazwa.append(wynik.getString("nazwa")+", ");
				tmpNazwa.append(wynik.getString("ulica")+" ");			
				tmpNazwa.append(wynik.getInt("numer")+", ");
				tmpNazwa.append(wynik.getString("miasto"));
				return tmpNazwa.toString();
			}				
			}
			catch(SQLException e) 
			{
				e.printStackTrace();
				return "error";
				
			}
	}
}
